/*
    Asignatura: Procesadores de lenguajes.
    Practica de labotario numero 10.
    Autores:
                Guillermo Garcia Juanes (Alu3889)
                Jose Antonio Hernandez Gonzalez (Alu3809)

    Fichero: AnalexC.g
    Contenido: Analizador Sintactico definido en la practica 10 para el lenguaje C.
*/
parser grammar AnasinC;

options{
    tokenVocab = AnalexC;
    ASTLabelType=CommonTree;
    output = AST;
}

tokens {
    INIT_C;
    FUNCION;
    LLAMADA;
}

@header{ package pl.equipo13.p10; }

/*----------------------------------------------------SINTACTICO----------------------------------------------------*/
entrada: (declararvariable | declararfuncion)* EOF -> ^(INIT_C declararvariable* declararfuncion*);

declararvariable: tipodato IDENT (COMA IDENT)* SEPARADOR -> ^(IDENT tipodato)*;
declararfuncion: tipodato IDENT APARENTESIS CPARENTESIS ALLAVE (instruccion)* CLLAVE -> ^(FUNCION IDENT tipodato instruccion*);

instruccion: declararvariable | asignacion | llamada | ifstm | bwhile | ibreak | ifarit;
asignacion: IDENT ASIGNACION^ exp SEPARADOR!;
llamada: IDENT APARENTESIS CPARENTESIS SEPARADOR -> ^(LLAMADA IDENT VOID);
bwhile: WHILE^ APARENTESIS! exp CPARENTESIS! ALLAVE! (instruccion)* CLLAVE!;
ifstm: IF^ APARENTESIS! exp CPARENTESIS! instruccion ELSE! instruccion;
ifarit: exp INTERR^ exp DOSPUNTOS! exp SEPARADOR!;
ibreak: BREAK SEPARADOR!;

// Expresiones
exp: (GUION)? exp_sr (OPCOMP^ exp_sr)?;
exp_sr: exp_mult (SUMRES^ exp_mult)*;
exp_mult: exp_base (MULDIV^ exp_base)*;
exp_base: variable | APARENTESIS! exp_base CPARENTESIS!;
variable: NUMERO | IDENT | CARACTER;


tipodato: VOID | INT | CHAR | FLOAT;